package com.example.ad.sdk.domain.helper

import com.example.ad.sdk.configs.AdConfig
import com.example.ad.sdk.domain.manager.CoroutineScopeManager
import com.example.ad.sdk.domain.utils.AppDeviceUtil
import kotlinx.coroutines.launch

/**
 * 构建配置帮助类
 *
 * 用于管理和提供应用程序的配置信息，包括应用ID、名称、调试模式等。
 * 同时负责获取设备唯一标识符(OAID、GAID)等广告相关的重要信息。
 */
object BuildConfigHelper {

    /** 广告配置对象，存储应用的基本配置信息 */
    private var config: AdConfig? = null
    
    /** OAID（Open Anonymous Identifier）设备标识符 */
    private var _oaid: String = ""

    /** GAID（Google Advertising ID）广告标识符 */
    private var _gaid: String = ""

    /**
     * 初始化配置
     *
     * 设置广告配置对象并初始化设备唯一标识符。
     *
     * @param config 广告配置对象
     */
    fun initConfig(config: AdConfig){
        this.config = config
        initAdUniqueId()
    }

    /**
     * 获取应用ID
     *
     * @return 应用ID，如果未配置则返回空字符串
     */
    fun getAppId(): String{
        return config?.appId ?: ""
    }

    /**
     * 获取调试模式状态
     *
     * @return 调试模式开关，true表示开启，false表示关闭
     */
    fun  getDebug(): Boolean{
        return config?.debug ?: false
    }

    /**
     * 是否开启日志标志
     *
     * 通过懒加载方式获取调试模式状态，避免重复计算。
     */
    val isOpenLog by lazy { config?.debug ?: false}

    /**
     * 获取应用名称
     *
     * @return 应用名称，如果未配置则返回空字符串
     */
    fun getAppName(): String{
        return config?.appName ?:""
    }

    /**
     * 获取OAID设备标识符
     *
     * 如果OAID尚未获取，则会触发初始化操作。
     *
     * @return OAID设备标识符，如果获取失败则返回空字符串
     */
    fun getOAID(): String{
        if (_oaid.isEmpty()) {
            initAdUniqueId()
        }
        return _oaid
    }

    /**
     * 获取GAID广告标识符
     *
     * 如果GAID尚未获取，则会触发初始化操作。
     *
     * @return GAID广告标识符，如果获取失败则返回空字符串
     */
    fun getGAID(): String{
        if (_gaid.isEmpty()) {
            initAdUniqueId()
        }
        return _gaid
    }

    /**
     * 初始化设备唯一标识符
     *
     * 在协程中异步获取OAID和GAID设备标识符，避免阻塞主线程。
     * 只有当对应标识符尚未获取时才会执行获取操作。
     */
    private fun initAdUniqueId(){
        CoroutineScopeManager.defaultScope.launch {
            if (_oaid.isEmpty()){
                AppDeviceUtil.getOAID(
                    ContextHelper.context
                ) {result ->
                    _oaid = result ?: ""
                }
            }
            if (_gaid.isEmpty()){
                AppDeviceUtil.getGAID(ContextHelper.context)
            }
        }
    }
}